package model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import org.hibernate.annotations.Formula;

@Entity
@Table(name = "USUARIO")
@XmlRootElement
public class Usuario implements java.io.Serializable {

    private long usuCodigo;
    private String usuNome;
    private String usuEmail;
    private String usuSenha;
    private Boolean usuBloqueado;
    private Boolean usuAdministrador;
    private UsuarioGrupo usuarioGrupo;
    private Boolean usuPermissaoPorGrupo;
    /**
     * Lookup
     */
    private String ugrNome;

    public Usuario() {
    }

    public Usuario(long usuCodigo, String usuNome, String usuEmail) {
        this.usuCodigo = usuCodigo;
        this.usuNome = usuNome;
        this.usuEmail = usuEmail;
    }

    public Usuario(long usuCodigo, String usuNome, String usuEmail, String usuSenha) {
        this.usuCodigo = usuCodigo;
        this.usuNome = usuNome;
        this.usuEmail = usuEmail;
        this.usuSenha = usuSenha;
    }

    @Id
    @SequenceGenerator(name = "seqUsuario", sequenceName = "SEQ_USUARIO")
    @Column(name = "USU_CODIGO", unique = true, nullable = false, precision = 10, scale = 0)
    public long getUsuCodigo() {
        return this.usuCodigo;
    }

    public void setUsuCodigo(long usuCodigo) {
        this.usuCodigo = usuCodigo;
    }

    @Column(name = "USU_NOME", length = 100)
    public String getUsuNome() {
        return this.usuNome;
    }

    public void setUsuNome(String usuNome) {
        this.usuNome = usuNome;
    }

    @Column(name = "USU_EMAIL", unique = true, length = 100)
    public String getUsuEmail() {
        return this.usuEmail;
    }

    public void setUsuEmail(String usuEmail) {
        this.usuEmail = usuEmail;
    }

    @Column(name = "USU_SENHA", length = 30)
    public String getUsuSenha() {
        return this.usuSenha;
    }

    public void setUsuSenha(String usuSenha) {
        this.usuSenha = usuSenha;
    }

    @Column(name = "USU_BLOQUEADO", length = 1)
    public Boolean getUsuBloqueado() {
        return usuBloqueado;
    }

    public void setUsuBloqueado(Boolean usuBloqueado) {
        this.usuBloqueado = usuBloqueado;
    }

    @Column(name = "USU_ADMINISTRADOR", length = 1)
    public Boolean getUsuAdministrador() {
        return usuAdministrador;
    }

    public void setUsuAdministrador(Boolean usuAdministrador) {
        this.usuAdministrador = usuAdministrador;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "UGR_CODIGO")
    public UsuarioGrupo getUsuarioGrupo() {
        return usuarioGrupo;
    }

    public void setUsuarioGrupo(UsuarioGrupo usuarioGrupo) {
        this.usuarioGrupo = usuarioGrupo;
    }

    @Formula("(SELECT UGR.UGR_NOME "
            + "  FROM USUARIO_GRUPO UGR"
            + " WHERE UGR.UGR_CODIGO = UGR_CODIGO)")
    public String getUgrNome() {
        return ugrNome;
    }

    public void setUgrNome(String ugrNome) {
        this.ugrNome = ugrNome;
    }

    @Column(name = "USU_PERMISSAOPORGRUPO", length = 1)
    public Boolean getUsuPermissaoPorGrupo() {
        return usuPermissaoPorGrupo;
    }

    public void setUsuPermissaoPorGrupo(Boolean usuPermissaoPorGrupo) {
        this.usuPermissaoPorGrupo = usuPermissaoPorGrupo;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 67 * hash + (int) (this.usuCodigo ^ (this.usuCodigo >>> 32));
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Usuario other = (Usuario) obj;
        if (this.usuCodigo != other.usuCodigo) {
            return false;
        }
        return true;
    }
}
